package com.magicalcoder.youyamvc.core.service;

import java.util.List;
import java.util.Map;
import java.util.Set;

public interface ICommonService<T> {
    /**
     * 根据主键获取实体
     * @param id 主键
     * @return
     */
    T getModel(Long id);

    /**
     * 不返回被忽略的字段
     * @param id
     * @param ignoreFields 建议放常量中统一维护 如果不传则全部返回
     * @return
     */
    T getModelIgnore(Long id,String ... ignoreFields);

    /**
     * 只返回不被忽略的字段
     * @param id
     * @param notIgnoreFields 建议放常量中统一维护 如果不传则全部返回
     * @return
     */
    T getModelNotIgnore(Long id,String ... notIgnoreFields);

    /**
     * 调用mybatis selectOne 如果查询返回超过1条 就会发生异常 请自行处理
     * @param query 入参 调用MapUtil构造
     * @return
     */
    T selectOneModelWillThrowException(Map<String, Object> query);
    T selectOneModelWillThrowExceptionIgnore(Map<String, Object> query,String ... ignoreFields);
    T selectOneModelWillThrowExceptionNotIgnore(Map<String, Object> query,String ... notIgnoreFields);
    /**
     * 获取满足条件的第一条数据
     * @param query 入参 调用MapUtil构造
     * @return
     */
    T selectFirstModel(Map<String, Object> query);
    T selectFirstModelIgnore(Map<String, Object> query,String ... ignoreFields);
    T selectFirstModelNotIgnore(Map<String, Object> query,String ... notIgnoreFields);
    /**
     * 查询实体集合
     * @param query
     * @return
     */
    List<T> getModelList(Map<String, Object> query);
    List<T> getModelInList(Set<Long> idList);
    List<T> getModelListIgnore(Map<String, Object> query,String ... ignoreFields);
    List<T> getModelListNotIgnore(Map<String, Object> query,String ... notIgnoreFields);

    /**
     * 查询实体集合的个数
     * @param query
     * @return
     */
    Integer getModelListCount(Map<String, Object> query);

    /**
     * 保存实体 保证Model 主键为空
     * @param model
     * @return null
     */
    int insertModel(T model);

    /**
     * 智能保存实体 Model必须存在主键或者唯一键 根据这个键值查询库里是否存在此条记录 存在则进行替换老的记录 不存在则插入新记录
     * @param model
     * @return null
     */
    int  replaceModel(T model);

    /**
     * 更新实体 null值会字段设置数据库默认字段
     * 保证实体中的主键不为空
     * @param model
     */
    int updateModel(T model);

    /**
     * 更新实体 null字段忽略更新
     * 保证实体中的主键不为空
     * @param model
     */
    int updateModelWithoutNull(T model);

    /**
     * 根据主键删除实体
     * @param id
     */
    int deleteModel(Long id);
    /**
     * 删除实体集合 使用不当 就会造成整个表清空，务必保证query的字段对应的值存在
     * @param query 如果字段值不为空 将作为查询条件
     */
    int deleteModelList(Map<String,Object> query);

    /**
     * 清空实体表
     */
    void truncateModel();

    /**
     *  批量插入实体，保证list中的实体 主键为空
     * @param list
     * return 批量自动把实体主键设置
     */
    int batchInsertModel(List<T> list);

    /**
     *  智能批量保存实体，Model必须存在主键或者唯一键 根据这个键值查询库里是否存在此条记录 存在则替换老的记录 不存在则插入新记录
     * @param list
     * @retrun 批量自动把实体主键设置
     */
    int batchReplaceModel(List<T> list);

    /**
     * 批量更新实体 保证list中的实体 主键不为空
     * @param list
     */
    int batchUpdateModel(List<T> list);

    /**
     * 根据主键list 批量删除实体
     * @param idList
     */
    int batchDeleteModel(List<Long> idList);

    /**
     * 根据主键list 批量删除实体
     * @param ModelList 如果字段值不为空 将作为查询条件
     */
    int batchDeleteModelList(List<T> ModelList);

    /**
     * 事务保证 导入json文件成功
     * @param list json反序列化后的文件
     * @return 暂时未实现
     */
    @Deprecated
    void transactionImportJsonList(List<T> list);

}
